home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
parallax
/
more_exa.tar
/
more
/
seidel.p
< prev
next >
Wrap
Text File
|
1993-10-13
|
2KB
|
97 lines
SYSTEM gauss_seidel;
(* modified gauss-seidel iterative method *)
(* see: Akl or Leighton *)
CONST n = 3;
eps = 0.01;
max_iter = 100;
init_val = 1.0;
TYPE matrix = ARRAY [1..n],[1..n+1] OF REAL;
line = ARRAY [1..n] OF REAL;
CONFIGURATION grid[0..n-1],[0..n];
CONNECTION diag : grid[i,j] -> grid[i,i].diag;
col : grid[i,i] -> grid[0..n-1,i].col;
SCALAR a : matrix;
i,j : INTEGER;
aborted: BOOLEAN;
PROCEDURE input (SCALAR VAR a : matrix);
(* reading input for A and b from terminal *)
SCALAR i,j : INTEGER;
BEGIN
WriteString("Enter value of matrix A and vector b line by line :");
WriteLn;
FOR i := 1 TO n DO
FOR j := 1 TO n+1 DO ReadReal(a[i,j]) END;
END;
END input;
PROCEDURE print_res(SCALAR regular: BOOLEAN; SCALAR res: line);
SCALAR i: INTEGER;
BEGIN
IF NOT regular THEN
WriteString("iteration aborted after max loops process ");
WriteLn;
ELSE
WriteString("Results:"); WriteLn;
FOR i:=1 TO n DO
WriteFixPt(res[i],20,7);
WriteLn;
END;
END;
END print_res;
PROCEDURE solve (SCALAR sa: matrix);
SCALAR iter : INTEGER;
regular : BOOLEAN;
res : line;
diff : REAL;
VECTOR a,b, x,old,nsum: REAL;
BEGIN
LOAD(a,sa);
regular := FALSE;
PARALLEL
x := init_val;
old := init_val;
IF DIM2=n THEN SEND grid.diag(a) TO grid.diag(b) END;
iter := 0;
REPEAT
IF DIM1 <> DIM2 THEN
IF DIM2<n THEN SEND grid.diag(a*x) TO grid.diag(nsum) REDUCE.SUM END
ELSE (* diagonal *)
x := 0.5 * x + 0.5 * (b - nsum) / a;
(* x := (b - nsum) / a; *)
diff := REDUCE.SUM( ABS(x-old) );
IF diff < eps THEN
regular := TRUE;
STORE(x,res);
ELSE
old := x;
SEND grid.col(x) TO grid.col(x);
INC(iter);
END; (* if diff *)
END; (* if DIM *)
UNTIL regular OR (iter = max_iter);
ENDPARALLEL;
print_res(regular, res);
END solve;
BEGIN (* main *)
input(a);
aborted := FALSE;
FOR i:=1 TO n DO (* check *)
IF a[i,i] = 0.0 THEN
WriteString("aborted: a[i,i] = 0.0");
WriteLn;
aborted := TRUE;
END
END;
IF NOT aborted THEN solve(a) END;
END gauss_seidel.